#!/usr/bin/env python
#-*- coding:utf-8 -*
#
# LibKontrolcu
#  - Kontrolcu Kütüphanesi
#
# Geliştiriciler:
#  - Osman KARAGÖZ <osmank3@gmail.com>
#  - Taha Doğan Güneş <tdgunes@gmail.com>
# Belgelendirici:
#  - Okan Okuroğulları <ookurogullari@gmail.com>
#
# Web Sitesi: http://code.google.com/p/kontrolcu
# Lisansı: GPL v3 ile lisanslanmıştır.
#
# Yardım dökümanlarını http://code.google.com/p/kontrolcu/w/list 
#                                     adresinden bulabilirsiniz.

# thread modülü deneysel bir çalışma içindir. :)
import hashlib, urllib, os, time, thread, sys

hatadurum = []
sondurum=[]

_surum = "1.7-SVN-pre3"

def toplamver(kontip, dosyagir):
    dosya = open(dosyagir).read()
    a = kontip()
    a.update(dosya)
    toplam = a.hexdigest()
    return toplam

def check(doskont):
    adres = urllib.urlopen(doskont[0])
    kont1 = adres.read().decode("utf8")
    adres.close()
    kont2 = kont1.split("\n")
    n = 0
    while len(kont2)>n+1:
	kontroller = { 32 : hashlib.md5, 40 : hashlib.sha1, 56 : hashlib.sha224,  64 : hashlib.sha256, 96 : hashlib.sha384, 128 : hashlib.sha512 }
        kontlistesi = kont2[n].split()
        kontop = kontlistesi[0]
	kontip = kontroller.get(len(kontop)) 
	try:
	    a = kontip()
	except:
	    if doskont[0][:5] == "http:" or doskont[0][:4] == "ftp:" or doskont[0][:6] == "https:":
                hatano = 001
                hatadurum.append(hatano)
            else:
                hatano = 002
                hatadurum.append(hatano)
        kontlistesi.pop(0)
        kontdosya = ""
        for i in kontlistesi:
            kontdosya += i
            kontdosya += " "
        kontdosya=kontdosya[:-1]
        kontdosya=kontdosya.replace("*", "")
        try:
            kdosya=file(kontdosya).read()
        except:
            try:
                if len(doskont) == 1:
                    yol=os.path.split(doskont[0])[0]
                    os.chdir(yol)
                    kdosya=file(kontdosya).read()
                    pass
                else:
                    os.chdir(doskont[1])
                    kdosya=file(kontdosya).read()
                    pass
            except OSError, (hata_no, hata):
                hatano = 003
                hatadosya = kontdosya
                hatadurum.append(hatano)
                hatadurum.append(hatadosya)
                n += 1
		return hatadurum
                continue
            except IOError, (hata_no, hata):
                hatano = 003
                hatadosya = kontdosya
                hatadurum.append(hatano)
                hatadurum.append(hatadosya)
                n += 1
                continue
            except MemoryError:
                hatano = 004
                hatadosya = kontdosya
                hatadurum.append(hatano)
                hatadurum.append(hatadosya)
                n += 1
                continue
        a.update(kdosya)
        x = a.hexdigest() 
        if x==kontop:
            durum=True
            durumdosya=kontdosya
        else:
            durum=False
            durumdosya=kontdosya
        sondurum.append(durum)
        sondurum.append(durumdosya)
        n += 1
    return sondurum, hatadurum

def ccheck(dosya, kontop):
    try:
	kontroller = { 32 : hashlib.md5, 40 : hashlib.sha1, 56 : hashlib.sha224,  64 : hashlib.sha256, 96 : hashlib.sha384, 128 : hashlib.sha512 }
	kontip = kontroller.get(len(kontop))
        if kontip == None:
	    raise TypeError
    except:
        hatano=011
        hatadurum.append(hatano)
    if len(hatadurum) == 0:
        toplam = toplamver(kontip, dosya)
        if toplam == kontop:
            durum = True
            sondurum.append(durum)
            sondurum.append(dosya)
        else:
            durum = False
            sondurum.append(durum)
            sondurum.append(dosya)
    return sondurum, hatadurum

# - Deneyler -



#Yeni teknoloji denemeleri (Şu an bu öğeler ana programlarda kullanılmıyor.)
#-------------------------------------
#-   Şu an ki deneysel öğeler
#- - - - - - - - - - - - - - - - - - - 
#- 1. KontrolEt ( Object-Oriented )
#- 2. MultiToplamVer ( Multi-Threading )
#- 3. Kısalt ( Functions )
#- 4. Return ile Toplam Ver ( Functions )
#- - - - - - - - - - - - - - - - - - - 
#- - - - - - - - - - - - - - - - - - - 


#- 1. KontrolEt ( Object-Oriented )

class KontrolEt:
  def __init__(self, dosyayolu="", kontip=""):
      self.dosyayolu= dosyayolu
      self.kontip= kontip
  def __str__(self):
    dosya = open(self.dosyayolu).read()
    a = self.kontip()
    a.update(dosya)
    toplam = a.hexdigest()
    return toplam

# Kullanımı :
# 
# a = libkontrolcu.KontrolEt("dosyadi",kontroltipi)
# print str(a)
# 
# Gereken Modüller :
# 
# libkontrolcu, hashlib
# 
# Not: reqr(a) sadece a tanımlandığında işlev görür. reqr(b) 
# dendiğinde bult-in olarak çalışır.
# 
# 2. Not: reqr istenirse str, lt, le, eq, ne, ge, gt şeklinde değiştiriliebilir.
# 

#- 2. MultiToplamVer( Multi-Threading )

def multitoplamver(kontip, doslist):
    def f(x,kontip, doslist):
      global toplamlar,y
      print "Süreç Başlatıldı!"
      y = 0
      toplamlar = []
      while y<len(doslist):
	dosya = doslist[y]
	ac = open(dosya).read()
	a = kontip()
	a.update(dosya)
	y +=1
	toplamlar.append(a.hexdigest())
      i = 0
      while i<len(toplamlar):
	print "%s. dosya | toplamı : %s" % (i+1, toplamlar[i])
	i += 1
      print "Süreç Tamamlandı!"
      time.sleep(x)
    thread.start_new_thread(f,(9,kontip,doslist))

    
# Kullanımı :
# 
# libkontrolcu.multitoplamver(kontroltipi, dosyalistesi)
# print "Bitti"
# 
# Gereken Modüller :
# 
# libkontrolcu, hashlib
# 
# Not: Multi-Threading ile toplam listesi alınamıyor sadece yazdırılabiliyor. 
# Olayın bitişinden sonra kesinlikle bir komut daha yazılması stabilliğini artırıyor.(İlginç evet, ilginç)
# 

#- 3. Kısalt( Functions )

def kisalt(yazi, uzunluk=25, ek="..."):
  if len(yazi) > uzunluk:
    yazi = yazi[:uzunluk - len(ek)] + ek
  return yazi

# Kullanımı (örnek):
# 
# b = libkontrolcu.kisalt("Deneme yazisi",ek=".|.",uzulunk=7)
# print b
# 
# Gereken Modüller :
# 
# libkontrolcu
# 
# Not: Arayüzlerde işe yarayabilir.
# 

#4. Return ile Toplam Ver ( Functions )

def rtoplamver(kontip, dosyagir):
    dosya = open(dosyagir).read()
    a = kontip()
    a.update(dosya)
    toplam = a.hexdigest()
    return toplam

# Kullanımı :
# 
# b = libkontrolcu.rtoplamver(kontroltipi, dosyayolu)
# print b |Burada b direk toplama eşit oluyor.
# 
# Gereken Modüller :
# 
# libkontrolcu, hashlib (from hashlib import md5, sha1 ile tüm hashlib modülünden kurtulabilirsiniz.
#kullanışı ise a = libkontrolcu.rtoplamver(md5, dosyayolu) şeklinde olabilir.)
# 
# Not: Bundaki amaç Global değerlerinden kurtulmak, programdaki yükü azaltmaktır.
# 

# - Deneyler -












